package com.bt.lms.ui.page.sys.study.action;

import com.alibaba.fastjson.JSONObject;
import com.bt.lms.constants.BOConstant;
import com.bt.lms.constants.SysBizTypeConstant;
import com.bt.lms.entity.StudyCen;
import com.bt.lms.network.msg.ReqMsg;
import com.bt.lms.network.msg.RespMsg;
import com.bt.lms.ui.page.sys.ServerInfo;
import com.bt.lms.ui.page.sys.utils.ArrayUtils;
import com.bt.lms.ui.page.sys.utils.Encode;
import com.bt.lms.ui.page.sys.utils.NetWorkUtils;
import com.bt.lms.ui.page.sys.vo.StudyCenTableViewVo;
import com.bt.lms.ui.vo.PageSkipInfo;
import com.bt.lms.ui.page.sys.study.PageDetails;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.layout.Pane;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;

/**
 * 查看详情按钮事件（列表界面）
 *
 * @author 徐大永
 */
public class SLDetailsBtn implements EventHandler<ActionEvent> {

    /**
     * 界面跳转信息
     */
    private final PageSkipInfo pageSkipInfo;

    /**
     * 要查看详情的学习中心列表对象
     */
    private final StudyCenTableViewVo studyCenTableViewVo;

    /**
     * 构建事件
     *
     * @param studyCenTableViewVo 要查看详情的学习中心列表对象
     * @param pageSkipInfo        界面跳转信息
     */
    public SLDetailsBtn(StudyCenTableViewVo studyCenTableViewVo, PageSkipInfo pageSkipInfo) {
        this.studyCenTableViewVo = studyCenTableViewVo;
        this.pageSkipInfo = pageSkipInfo;
    }

    /**
     * 事件实现
     *
     * @param event the event which occurred
     */
    @Override
    public void handle(ActionEvent event) {

        //1.网络请求 得学习中心详细信息
        StudyCen studyCen = netRequest();
        //判断是否正常得到学习中心
        if (studyCen == null){
            hint();
        }else {
            //2.界面跳转
            PageSkip(studyCen);
        }


    }

    /**
     * 界面跳转
     * @param studyCen 学习中心
     */
    private void PageSkip(StudyCen studyCen) {

        Pane pane = pageSkipInfo.getPane();
        Integer index = pageSkipInfo.getIndex();

        PageDetails pageDetails = new PageDetails(studyCen, pageSkipInfo);

        ObservableList<Node> children = pane.getChildren();
        children.set(index, pageDetails);

    }

    /**
     * 网络请求
     * @return  学习中心
     */
    private StudyCen netRequest() {

        //1.发送请求
        //1.1组包
        ReqMsg reqMsg = Encode.encodeToMsg(studyCenTableViewVo, SysBizTypeConstant.STUDY_CEN_DETAILS);
        //1.2转消息包
        byte[] reqByte = reqMsg.toBytes();
        try {
            //1.3开网发送
            Socket socket = new Socket(ServerInfo.IP,ServerInfo.PORT);
            OutputStream out = socket.getOutputStream();
            //1.4发送
            out.write(reqByte);
            out.flush();
            //2.接收响应
            InputStream in = socket.getInputStream();
            List<byte[]> respBytes = NetWorkUtils.receive(in);
            byte[] respByte = ArrayUtils.joinBytes(respBytes);
            //2.1转响应消息
            RespMsg respMsg = RespMsg.toRespMsg(respByte);
            //2.2判断状态
            short status = respMsg.getStatus();
            if (status== RespMsg.NETWORK_STATUS_NORMAL){
                //2.3 处理数据
                String data = respMsg.getData();
                StudyCen studyCen = JSONObject.parseObject(data, StudyCen.class);
                //3 关闭资源
                in.close();
                out.close();
                socket.close();

                return studyCen;
            }else {
                //状态错误提示
                hint();
                return null;
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private void hint() {
    }
}
